from django.shortcuts import render
from meiduo_mall.libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from . import constants
from django.http import HttpResponse
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from . import serializers
from celery_tasks.sms.tasks import send_sms_code
#随机验证码
import random
#使用云通讯
from meiduo_mall.libs.yuntongxun.sms import CCP
# Create your views here.
import logging

logger = logging.getLogger('django')

#设置短信验证码视图
#GET /sms_codes/(?P<mobile>1[3-9]\d{9})/?
class SMSCodeView(GenericAPIView):
    """
    短信传入参数： mobile(手机号)  image_code_id（图片验证码）  text（验证码内容）
    """
    #定义序列化器
    serializer_class = serializers.ImageCodeCheckSerializer

    def get(self,resquest,mobile):
        """
        接受参数：image_code_id ,text
        校验参数：image_code_id ,text
        对比text和数据库中的图片验证码内容（暂时不校验
        """
        #实例化序列化器
        serializer = self.get_serializer(data=resquest.query_params)
        serializer.is_valid(raise_exception =True)

       #生成随机短信验证码
        sms_code = '%06d' % random.randint(0,999999)
        logger.info(sms_code)
        #发送短信验证码        发给谁      发送内容  时间 模板
        #一步的发送短信验证码中间掉delay
        #delay讲演示任务，添加到任务队列，并且出发异步任务，然后worker可以观察到
        send_sms_code.delay(mobile,sms_code)
        # CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES // 60], 1)
       #把短信验证码保存到数据库中
        redis_conn =  get_redis_connection('verify_codes')
        # #名字   时间 值倒计时销毁
        # redis_conn.setex('sms_%s'% mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
        # #设置短信60s倒计时
        # redis_conn.setex('send_flg_%s'%mobile,constants.SEND_CODE_MOBILE,1)
        #使用管道访问一次数据库
        pl = redis_conn.pipeline()
        # 名字   时间 值倒计时销毁
        pl.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        # 设置短信60s倒计时
        pl.setex('send_flg_%s' % mobile, constants.SEND_CODE_MOBILE, 1)
        #使用管道一定的使用execute推一把
        pl.execute()
       #发送短信验证码
        return Response({'message':'OK'})

class ImageCodeView(APIView):
    """图片验证码"""
    def get(self,request,image_code_id):
        """提供短信验证码"""

        text, image = captcha.generate_captcha()
        print(text)
        print(1)

        redis_conn = get_redis_connection("verify_codes")
        # setex  名字   时间 值倒计时销毁
        redis_conn.setex("img_%s" % image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
        logger.info(text)
        print(image_code_id)
        # 固定返回验证码图片数据，不需要REST framework框架的Response帮助我们决定返回响应数据的格式
        # 所以此处直接使用Django原生的HttpResponse即可
        return HttpResponse(image, content_type="images/jpg")